package com.hucsmn.stumansys.dao;

import com.hucsmn.stumansys.dao.impl.AdminDaoImpl;
import com.hucsmn.stumansys.dao.impl.StudentDaoImpl;
import com.hucsmn.stumansys.entity.Student;

import java.util.List;

/**
 * 学生信息持久化层。
 * @author hucsmn
 */
public interface StudentDao {
    /**
     * 获取 StudentDao 实现类的实例对象。
     * @return StudentDao 实例。
     */
    static StudentDao getInstance() {
        return new StudentDaoImpl();
    }

    /**
     * 添加学生信息，成功时设置实体类的 ID。
     * @param student 学生信息。
     * @return 是否成功添加。
     */
    boolean addStudent(Student student);

    /**
     * 删除单个学生信息。
     * @param id 学生信息 ID。
     * @return 是否成功删除。
     */
    boolean removeStudent(int id);

    /**
     * 删除多个学生信息。
     * @param ids 学生信息 ID 列表。
     * @return 是否成功删除。
     */
    boolean removeStudents(int[] ids);

    /**
     * 通过 ID 设置学生信息。
     * @param student 学生信息。
     * @return 是否成功设置。
     */
    boolean setStudent(Student student);

    /**
     * 通过 ID 获取学生信息。
     * @param id 学生信息 ID。
     * @return 学生信息，查询失败时返回 null。
     */
    Student getStudentById(int id);

    /**
     * 通过卡号获取学生信息。
     * @param card 学生卡号。
     * @return 学生信息，查询失败时返回 null。
     */
    Student getStudentByCard(String card);

    /**
     * 获取学生信息总数。
     * @return 学生信息总数，查询失败时返回 -1。
     */
    long countStudents();

    /**
     * 获取全部学生信息列表区段，按照 ID 升序排列。
     * @param since 从第几条记录开始。
     * @param limit 记录最大返回数量。
     * @return 学生信息列表，查询失败时返回 null。
     */
    List<Student> getStudents(long since, int limit);

    /**
     * 查找姓名中包含特定字符串的学生信息总数。
     * @param contains 学生姓名包含字符串。
     * @return 符合条件的学生信息总数，查询失败时返回 -1。
     */
    long countStudentsNameContains(String contains);

    /**
     * 获取姓名中包含特定字符串的学生信息列表区段，按照 ID 升序排列。
     * @param contains 学生姓名包含字符串。
     * @param since 从第几条记录开始。
     * @param limit 记录最大返回数量。
     * @return 学生信息列表，查询失败时返回 null。
     */
    List<Student> getStudentsNameContains(String contains, long since, int limit);
}
